package com.miage.itrading.server.business;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.SQLException;
import java.util.Date;
import java.util.StringTokenizer;

import com.miage.itrading.server.dao.CotationDAO;

public class StockQuoter {
	String				csvString;
	URL					url			= null;
	URLConnection		urlConn		= null;
	InputStreamReader	inStream	= null;
	BufferedReader		buff		= null;

	/**
	 * 
	 * @param cotationdao
	 * @param jourDebut
	 * @param moisDebut
	 *            de 0 à 11
	 * @param anneeDebut
	 * @param jourFin
	 * @param moisFin
	 *            de 0 à 11
	 * @param anneeFin
	 */
	public StockQuoter(CotationDAO cotationdao, int jourDebut, int moisDebut,
			int anneeDebut, int jourFin, int moisFin, int anneeFin) {

		try {
			String adresse = "http://ichart.finance.yahoo.com/table.csv?s="
					+ cotationdao.getCotation().getMnemonique() + "&d="
					+ moisFin + "&e=" + jourFin + "&f=" + anneeFin + "&g=d&a="
					+ moisDebut + "&b=" + jourDebut + "&c=" + anneeDebut
					+ "&ignore=.csv";

			url = new URL(adresse);

			urlConn = url.openConnection();
			inStream = new InputStreamReader(urlConn.getInputStream());
			buff = new BufferedReader(inStream);

			// get the quote as a csv string
			buff.readLine();

			boolean annulerMaj = false;

			int i;
			for (i = 0; (csvString = buff.readLine()) != null; ++i) {
				// parse the csv string
				StringTokenizer tokenizer = new StringTokenizer(csvString, ",");

				String date = tokenizer.nextToken();
				String ouverture = tokenizer.nextToken();
				String plusHaut = tokenizer.nextToken();
				String plusBas = tokenizer.nextToken();
				String fermeture = tokenizer.nextToken();
				String volume = tokenizer.nextToken();

				// Certaines dates lues sur Yahoo ne sont pas toujours mises à jour, on vérifie que
				// la première lue dans le fichier est après la dernière entrée en base
				if (i == 0) {
					Date test = new Date(Integer.parseInt(date.split("-")[0]),
							Integer.parseInt(date.split("-")[1]), Integer
									.parseInt(date.split("-")[2]));

					Date debut = new Date(anneeDebut, moisDebut, jourDebut);

					if (debut.after(test)) {
						annulerMaj = true;
						break;
					}
				}

				cotationdao.ajouterHistorique(date, ouverture, fermeture,
						plusBas, plusHaut, volume);
			}

			if (annulerMaj == false) {

				System.out
						.println(cotationdao.getCotation().getNom()
								+ ", ajout de " + i + " entrées, de "
								+ jourDebut + "/" + (moisDebut + 1) + "/"
								+ anneeDebut + " à " + jourFin + "/"
								+ (moisFin + 1) + "/" + anneeFin + ", "
								+ adresse);

				cotationdao.ecrireCotation();
			}

		} catch (MalformedURLException e) {
			System.out.println("Please check the spelling of the URL:"
					+ e.toString());
		} catch (IOException e1) {
			System.out
					.println("Can't read from the Internet: " + e1.toString());
		} catch (SQLException e) {
			// FIXME Gerer l'exception
		}
	}
}
